﻿using NLog;
using System;

namespace SmartPlant.WinCore.Helper
{
    /// <summary>
    /// nLog使用帮助类
    /// </summary>
    public class LoggerHelper
    {
        /// <summary>
        /// 实例化nLog，即为获取配置文件相关信息
        /// </summary>
        private readonly NLog.Logger _logger = LogManager.GetCurrentClassLogger();

        private static LoggerHelper? _obj = null;

        /// <summary>
        /// 获取当前的日志记录<see cref="LoggerHelper"/>对象。
        /// </summary>
        public static LoggerHelper Current
        {
            get => _obj ?? (new LoggerHelper());
            set => _obj = value;
        }

        #region Debug，调试
        /// <summary>
        /// 调试信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Debug(string msg)
        {
            _logger.Debug(msg);
        }

        /// <summary>
        /// 调试信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Debug(string msg, Exception err)
        {
            _logger.Debug(err, msg);
        }
        #endregion

        #region Info，信息
        /// <summary>
        /// 普通信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Info(string msg)
        {
            _logger.Info(msg);
        }

        /// <summary>
        /// 普通信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Info(string msg, Exception err)
        {
            _logger.Info(err, msg);
        }
        #endregion

        #region Warn，警告
        /// <summary>
        /// 警告级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Warn(string msg)
        {
            _logger.Warn(msg);
        }

        /// <summary>
        /// 警告级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Warn(string msg, Exception err)
        {
            _logger.Warn(err, msg);
        }
        #endregion

        #region Trace，追踪
        /// <summary>
        /// 调试跟踪级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Trace(string msg)
        {
            _logger.Trace(msg);
        }

        /// <summary>
        /// 调试跟踪级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Trace(string msg, Exception err)
        {
            _logger.Trace(err, msg);
        }
        #endregion

        #region Error，错误
        /// <summary>
        /// 错误级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Error(string msg)
        {
            _logger.Error("----------------------------Error BEGIN------------------------------");
            _logger.Error(msg);
            _logger.Error("-----------------------------Error END-------------------------------");
        }
        /// <summary>
        /// 错误级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Error(string msg, Exception err)
        {
            _logger.Error("----------------------------Error BEGIN------------------------------");
            if (err != null)
                _logger.Error(err.StackTrace);
            _logger.Error(err, msg);
            _logger.Error("-----------------------------Error END-------------------------------");
        }
        #endregion

        #region Fatal,致命错误
        /// <summary>
        /// 致命错误级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        public void Fatal(string msg)
        {
            _logger.Fatal("----------------------------Fatal BEGIN------------------------------");
            _logger.Fatal(msg);
            _logger.Fatal("-----------------------------Fatal END-------------------------------");
        }
        /// <summary>
        /// 致命错误级别信息输出。
        /// </summary>
        /// <param name="msg">需要记录的信息。</param>
        /// <param name="err">需要记录的系统异常。</param>
        public void Fatal(string msg, Exception err)
        {
            _logger.Fatal("----------------------------Fatal BEGIN------------------------------");
            if (err != null) _logger.Fatal(err.StackTrace);
            _logger.Fatal(err, msg);
            _logger.Fatal("-----------------------------Fatal END-------------------------------");
        }
        #endregion
    }
}
